Позволяет создать стандартную реализацию IDispatch одним вызовом функции.
HRESULT CreateStdDispatch ( IUnknown FAR* punkOuter, void FAR*pvThis, ITypelnfo FAR*ptinfo, IUnknown FAR* FAR* ppunkStdDisp );
Параметры
punkOuter
Указатель на реализацию IUnknown для
объекта.
pvThis
Указатель на предоставляемый
объект.
ptinfo
Указатель на информацию о типе, описывающую
предоставляемый объект.
ppunkStdDisp
Возвращаемый интерфейс
IUnknown объекта, который реализует IDispatch. В случае ошибки
указатель равен NULL.
Коды возврата
Из возвращенного HRESULT получают один из следующих
кодов возврата:
| Код возврата | Значение |
| S_OK | Успех. |
| E_INVALIDARG | Один из первых трех параметров неверен. |
| E_OUTOFMEMORY | He хватает памяти для выполнения операции. |
Комментарии
При создании объекта вместо того, чтобы реализовывать для него
функции-члены IDispatch, Вы можете прибегнуть к CreateStdDispatch.
Однако создаваемая этой функцией реализация имеет следующие
ограничения:
Поддерживает только один национальный язык.
Поддерживает
возврат из Invoke только стандартных кодов
исключений.
LoadTypeLib, GetTypelnfoOfGuid и
CreateStdDispatch составляют минимальный набор функций, которые Вам
необходимо вызывать для предоставления объекта с использованием библиотеки типа.
Подробнее о LoadTypeLib и
GetTypelnfoOfGuid.
CreateDispTypelnfo и
CreateStdDispatch составляют минимальный набор диспетчерских компонентов,
которые необходимо вызывать для предоставления объекта с использованием
информации о типе, заданной в структуре INTERFACEDATA.
Пример
Следующий фрагмент кода реализует интерфейс IDispatch для
класса CCalc с помощью CreateStdDispatch.
CCalc FAR* CCalc::Create()
{
HRESULT hresult;
CCalc FAR* pcalc;
CArith FAR* parith;
ITypelnfo FAR* ptinfo;
IUnknown FAR* punkStdDisp;
extern INTERFACEDATA NEARDATA g_idataCCalc;
if ((pcalc = new FAR CCalc()) == NULL) return NULL;
pcalc->AddRef();
parith = &(pcalc->m_arith);
// Построить информацию о типе для функциональности объекта, к которой
// предоставляется программный доступ извне.
hresult = CreateDispTypeInfo(&g_idataCCalc, LOCALE_SYSTEM_DEFAULT, &ptinfo);
if(hresult != NOERROR) goto LErrorO;
// Создать агрегат с экземпляром стандартной реализации
// IDispatch, инициализированной нашей информацией о типе.
hresult = CreateStdDispatch(pcalc, // Управляющий IUnknown.
parith, // Экземпляр для распределения вызовов.
ptinfo, // Информация о типе, описывающая экземпляр.
&punkStdDisp);
ptinfo->Release();
if(hresult != NOERROR) goto LErrorO;
pcalc->m_punkStdDisp = punkStdDisp;
return pcalc;
LErrorO:;
pcalc->Release();
return NULL;
};